
//3488.距离最小相等元素查询
class Solution {
public:
    vector<int> solveQueries(vector<int>& nums, vector<int>& queries) {
        //将数组中所有相同数据的下标进行存储
        int n=nums.size(),m=queries.size();
        unordered_map<int,vector<int>> mm;
        for(int i=0;i<n;i++)
        mm[nums[i]].push_back(i);   //因为i是依次增大的，所以vector中i是有序的不需要进行排序

        //对所有数组左右两边各添加一个哨兵位，防止越界情况
        //eg:当前查询值后面没有该值就需要跨过数组进行查找,就是arr[0]-arr.back(),通过哨兵为就可以不需要判断是否越界的情况
        for(auto& [a,arr]:mm)
        {
            arr.insert(arr.begin(),arr.back()-n);  
            arr.push_back(arr[1]+n);
        }

        vector<int> ret(m);
        for(int i=0;i<m;i++)
        {
            int a=nums[queries[i]];
            if(mm.count(a)&&mm[a].size()>3) 
            {
                vector<int>& tmp=mm[a];
                //找到queries[i]的位置
                int index=lower_bound(tmp.begin(),tmp.end(),queries[i])-tmp.begin();

                int l=tmp[index]-tmp[index-1];
                int r=tmp[index+1]-tmp[index];
                ret[i]=min(l,r);
            }
            else ret[i]=-1;
        }
        return ret;
    }
};